home *** CD-ROM | disk | FTP | other *** search
/ 8bitfiles.net/archives / archives.tar / archives / compuserve-file-archive / 05 Programming / XMODV6.TXT < prev    next >
Text File  |  2019-04-13  |  15KB  |  850 lines

  1. *
  2. * XMODEM PROTOCOL VERSION 6.0
  3. *
  4. * COMMODORE 64
  5. *
  6. * THIS VERSION USES FILENAME
  7. * SUPPLIED BY CALLING PROGRAM
  8. * WITH CONSTRUCT:
  9. *
  10. *     A$="FILENAME"+CHR$(13)
  11. *     SYS 49152,A
  12. *
  13. *     Where A =  0   Ignore carrier detect
  14. *           A = 16   Check for carrier detect
  15. *
  16. * NOTE: Setting A$ *MUST* be just before SYS49152
  17. *       with no intervening string operations!
  18. *
  19. * COPYRIGHT (C) 1986 BY
  20. * MICROTECHNIC SOLUTIONS, INC.
  21. * ALL RIGHTS RESERVED
  22. *
  23. * THIS VERSION RELEASED TO PUBLIC DOMAIN
  24. *
  25.  TR ON ;truncation on (MERLIN)
  26.  ORG $C000
  27. *
  28. CHKIN = $FFC6
  29. CHKOUT = $FFC9
  30. CHROUT = $FFD2
  31. CLOSE = $FFC3
  32. CLRCHN = $FFCC
  33. GETIN = $FFE4
  34. OPEN = $FFC0
  35. READSS = $FFB7
  36. STOP = $FFE1
  37. SETLFS = $FFBA
  38. SETNAM = $FFBD
  39. SOH = 1
  40. ACK = 6
  41. NAK = 21
  42. EOT = 4
  43. CAN = 24
  44. VARPNT = $47
  45. JIFFY = $A1
  46. MOVE = $C3
  47. RIDBE = $029B
  48. RIDBS = $029C
  49. ENABLE = $02A1
  50. XMOBLK = $C700
  51. BLOCK = $C800
  52. BLN = $C800
  53. BLO = $C801
  54. BLCK1 = $C802
  55. BLDATA = $C803
  56. BLCH = $C883
  57. DPORTB = $DD01
  58.  JMP XMODEM
  59. DRVDEV DFB 8
  60. RCVCHR DFB 0
  61. RSTAT DFB 0
  62. CARRIER DFB 0
  63. TEMPX DFB 0
  64. FXMO DFB 0
  65. XMOSZ DFB 128
  66. LSTBLK DFB 0
  67. PADCHR DFB 0
  68. ERR DFB 0
  69. BLKNUM DFB 0
  70. CHRCNT DFB 0
  71. CKSUM DFB 0
  72. CISFMT DFB 4,0,67,67,51
  73. EBUFX DFB 0
  74. TRON DFB 128
  75. TBCOUNT DA $0000
  76. DSKDIR DFB 32
  77. TMP2X DFB 0
  78. FBUF DS 80
  79. BUF DS 80
  80. PLY DA $1021
  81. CRCDATA DFB 0
  82. XMODE DFB 0
  83. CTRYS DFB 3
  84. XBLSZ DFB 132
  85. CRC DA 0
  86. XMODEM AND #16 ;carrier request 16 or 0
  87.  STA CARRIER ;save carrier request
  88.  LDY #1 ;get the pointer to
  89.  LDA (VARPNT),Y ;the last string variable
  90.  STA MOVE ;referenced by the
  91.  INY  ;calling Basic program
  92.  LDA (VARPNT),Y
  93.  STA MOVE+1
  94.  CLC
  95.  LDA MOVE
  96.  ADC #1
  97.  STA MOVE
  98.  LDA MOVE+1
  99.  ADC #0
  100.  STA MOVE+1
  101.  LDY #0
  102.  LDX #0
  103. ]JLOOP LDA (MOVE),Y ;move the filename into
  104.  CMP #13 ;filename buffer
  105.  BEQ XMD04
  106.  STA FBUF,X
  107.  INX
  108.  INY
  109.  BNE ]JLOOP
  110. XMD04 STY TEMPX
  111.  LDX TEMPX
  112.  DEX
  113.  LDA #0 ;default is translation off
  114.  STA TRON
  115.  LDA FBUF,X
  116.  STA TMP2X
  117.  CMP #'t' ;check if last entry in
  118.  BNE XMD05B ;filename is translate
  119.  DEX  ;specifier to adjust for
  120.  DEX  ;finding up/down
  121.  LDA FBUF,X ;specifier
  122. XMD05B STA DSKDIR
  123.  CMP #'r' ;is direction specifer a
  124.  BEQ XMD05C ;a valid entry?
  125.  CMP #'w'
  126.  BNE XMD05A
  127. XMD05C DEX
  128.  LDA #',' ;check for intervening comma
  129.  CMP FBUF,X
  130.  BEQ XMD01A
  131. XMD05A LDA #6 ;user made an error in
  132.  JSR OUTMSG ;filename specification
  133.  JSR WAITTWO ;tell him and then exit
  134.  JSR XMD19
  135. XMD01A DEX
  136.  PHA
  137.  LDA FBUF,X ;now let us make sure he
  138.  CMP #'u' ;specified a valid
  139.  BEQ XMD01Z ;file type
  140.  CMP #'p' ;we will accept u p or s
  141.  BEQ XMD01Z
  142.  CMP #'s'
  143.  BEQ XMD01Y
  144.  PLA
  145.  JMP XMD05A
  146. XMD01Y LDA #'t' ;got by syntax check
  147.  CMP TMP2X ;now check for translate
  148.  BNE XMD01Z ;only if a sequential
  149.  LDA #128 ;file
  150.  STA TRON
  151. XMD01Z PLA
  152.  DEX
  153.  CMP FBUF,X
  154.  BNE XMD05A
  155.  LDA TEMPX ;whew! now we finally get
  156.  LDX #<FBUF ;to open the disk file
  157.  LDY #>FBUF
  158.  JSR SETNAM
  159.  LDA #8
  160.  JSR OPENDK
  161.  JSR ERRCHN ;error on open?
  162.  BEQ XMD01D ;yes - exit
  163.  JSR XMD18
  164. XMD01D LDA #2
  165.  JSR OUTMSG
  166.  LDA #3
  167.  STA CTRYS
  168.  LDA DSKDIR
  169.  CMP #'r' ;jump to upload or download
  170.  BNE XMD06 ;depending on direction
  171.  JMP XMD30 ;specified
  172. *
  173. * RECEIVE FILE
  174. *
  175. XMD06 LDA #0 ;initialize everybody
  176.  STA FXMO
  177.  STA XMODE
  178.  STA LSTBLK
  179.  STA TBCOUNT
  180.  STA TBCOUNT+1
  181.  STA BLKNUM
  182.  JSR SETZERO
  183.  JSR XMD60 ;get things rolling
  184.  LDA #128 ;normal data block size
  185.  STA XMOSZ
  186.  LDA #132
  187.  STA XBLSZ
  188.  BIT XMODE ;checksum or crc?
  189.  BMI XMD10 ;crc
  190. XMD06A LDA DPORTB ;do we still have carrier?
  191.  AND CARRIER
  192.  BEQ XMD06A1
  193.  JSR XMD28 ;get verification to abort
  194.  BEQ XMD06A
  195. XMD06A1 JSR SETZERO
  196. XMD07 JSR GTXMDM ;go get a modem character
  197.  LDA DPORTB ;still checking to see if
  198.  AND CARRIER ;carrier present
  199.  BEQ XMD07A1
  200.  JSR XMD28
  201.  BEQ XMD07
  202. XMD07A1 LDA CHRCNT
  203.  BNE XMD10
  204.  LDA RCVCHR ;look for end of transfer as
  205.  CMP #EOT ;first byte of block
  206.  BNE XMD07A
  207.  JMP XMD42
  208. XMD07A CMP #CAN ;check for user cancel
  209.  BNE XMD07B
  210.  JSR XMD19
  211. XMD07B CMP #SOH
  212.  BNE XMD07
  213. XMD10 JSR CHKADD ;add the data byte to checksum
  214.  CMP XBLSZ ;is this end of this block?
  215.  BNE XMD07 ;no - get next character
  216.  LDA BLO ;yes - check block number
  217.  CLC  ;with complement
  218.  ADC BLCK1
  219.  CLC
  220.  CMP #255
  221.  BEQ XMD11 ;block number is good
  222. XMD12 JSR XMD15 ;block error - send a NAK
  223.  JMP XMD06A
  224. XMD11 BIT XMODE ;checksum or crc?
  225.  BPL XMD11A ;checksum
  226.  LDA CRC
  227.  ORA CRC+1
  228.  BEQ XMD11B
  229.  BNE XMD12
  230. XMD11A LDA CKSUM ;now see if our calculated
  231.  SEC  ;checksum matches the one
  232.  SBC BLCH ;we received from the sender
  233.  CLC
  234.  CMP BLCH
  235.  BNE XMD12 ;checksum error - go NAK
  236. XMD11B INC BLKNUM ;now check to see if this is
  237.  LDA BLOCK+1 ;the block number we expected
  238.  CMP BLKNUM
  239.  BEQ XMD13
  240.  DEC BLKNUM ;overlay previous 2nd buffer
  241.  JMP XMD14C ;if sender repeated himself
  242. XMD13 LDA FXMO ;stuff into 2nd buffer if this
  243.  BEQ XMD14C ;is the first block
  244. XMD14 LDY #0
  245.  LDX #4
  246. XMD14D LDA XMOBLK,X ;look for compuserve
  247.  CMP CISFMT,X ;machine-specific header
  248.  BNE XMD14B ;and strip it out
  249.  DEX
  250.  BPL XMD14D
  251.  LDY #6
  252. XMD14B STY TEMPX ;write the 2nd buffer to disk
  253.  LDX #8
  254.  JSR CHKOUT
  255. XMD14A LDX TEMPX
  256.  LDA XMOBLK,X
  257.  BIT TRON ;translate the characters if
  258.  BPL XMD14E ;the translate flag is on
  259.  JSR CNVRT
  260. XMD14E JSR CHROUT
  261.  JSR READSS ;watch dem disk errors!
  262.  BNE XMDERR
  263.  INC TEMPX
  264.  LDA XMOSZ ;is this the end of the
  265.  CMP TEMPX ;data block portion?
  266.  BNE XMD14A ;no - keep writing to disk
  267.  BIT LSTBLK ;yes - is this the last
  268.  BPL XMD14C ;block of the file?
  269.  JMP XMD24 ;yes - time to finish up
  270. XMD14C JSR XMDBLK ;display current block info
  271.  LDX #0
  272. XMD41 LDA BLDATA,X ;move 1st buffer to 2nd
  273.  STA XMOBLK,X ;we use double-buffering for
  274.  INX  ;on-the-fly pad stripping
  275.  BPL XMD41 ;move 128 bytes
  276.  STX FXMO
  277.  LDA #ACK ;ACK the sender - this block
  278.  JSR PTXMDM ;was good
  279.  JSR CLRCHN
  280.  JMP XMD06A
  281. XMDERR JSR ERRCHN ;oops - got a disk error!
  282.  LDA #1 ;notify the user and then
  283.  JSR OUTMSG ;abort the file transfer
  284.  LDA #7 ;at xmd18
  285.  JSR OUTMSG
  286.  LDA #13
  287.  JSR SCNOUT
  288.  JSR XMD18
  289. XMD42 LDA #128 ;set last block indicator
  290.  STA LSTBLK
  291.  LDX #127 ;determine whether or not
  292.  LDA XMOBLK,X ;sender used ctrl-z or null
  293.  STA PADCHR ;as a pad character
  294.  CMP #26
  295.  BEQ XMD42A ;he used ctrl-z
  296.  CMP #0
  297.  BEQ XMD42A ;he used null
  298.  JMP XMD42C
  299. XMD42A LDA XMOBLK,X ;now back up into the last
  300.  CMP PADCHR ;block until we find the
  301.  BNE XMD42C ;final real data byte
  302.  DEX
  303.  BPL XMD42A
  304.  JMP XMD24
  305. XMD42C INX  ;set block size to match
  306.  STX XMOSZ ;end of last block
  307.  JMP XMD14
  308. CNVRT AND #127 ;convert ascii-petascii
  309.  CMP #65
  310.  BCC XMD14L
  311.  CMP #91
  312.  BCS XMD14K
  313.  ORA #32
  314.  JMP XMD14L
  315. XMD14K CMP #97
  316.  BCC XMD14L
  317.  CMP #123
  318.  BCS XMD14L
  319.  AND #223
  320. XMD14L RTS
  321. *
  322. * GET XMODEM CHAR
  323. *
  324. GTXMDM JSR SETJIF ;set character timeout
  325. GTX01 JSR STOP ;check to see if user is
  326.  BEQ GTXEX ;pressing stop key to abort
  327.  JSR GIM ;get character from modem
  328.  BNE GTX02 ;was there a character?
  329.  RTS  ;yes - return
  330. GTX02 JSR TSTJIF ;no - did we time out yet?
  331.  BCC GTX01 ;no - go try again
  332.  JSR XMD16 ;yes - go to error routine
  333.  PLA
  334.  PLA
  335.  JMP XMD06A ;return
  336. GTXEX JMP XMD18 ;user wants to abort
  337. *
  338. * CHECK CAN,NAK APPROPRIATE
  339. *
  340. XMD15 INC ERR ;cancel if 10 errors in a row
  341.  LDA #10 ;otherwise just NAK
  342.  CMP ERR
  343.  BEQ XMD18
  344. *
  345. * NAK
  346. *
  347. XMD16 LDA #'n'
  348.  STA DISPR8+18
  349.  LDA #NAK
  350.  JSR PTXMDM
  351.  RTS
  352. *
  353. * EOT
  354. *
  355. XMD17 LDA #EOT
  356.  JSR PTXMDM
  357.  RTS
  358. *
  359. * CAN
  360. *
  361. XMD18 LDA #CAN ;cancel the transfer
  362.  JSR PTXMDM
  363. XMD19 LDA #4 ;display message to user
  364.  JSR XMD25
  365.  JSR WAITTWO
  366.  PLA  ;jump all the way back to
  367.  PLA  ;the Basic program
  368.  RTS
  369. XMD28 LDA #8 ;ask user to confirm abort
  370.  JSR XMD25
  371. XMD28A JSR GETKEY ;get keyboard input
  372.  PHA
  373.  JSR CLRCHN
  374.  PLA
  375.  PHA
  376.  JSR CHROUT ;display user keystroke
  377.  PLA
  378.  CMP #'y' ;did he confirm abort?
  379.  BEQ XMD19 ;yes - exit transfer
  380.  CMP #'n'
  381.  BNE XMD28A ;not a valid response
  382.  LDA #13
  383.  JSR CHROUT
  384.  LDA #0 ;set to continue on
  385.  RTS  ;and return
  386. *
  387. * COMPLETE
  388. *
  389. XMD24 LDA #ACK ;acknowledge receipt of EOT
  390.  JSR PTXMDM
  391. XMD24A LDA #3 ;display completed message
  392. XMD25 JSR OUTMSG
  393.  LDA #8 ;close the file and go home
  394.  JMP CLOSE
  395. *
  396. * SEND FILE
  397. *
  398. XMD30 JSR STOP ;check is using is pressing
  399.  BNE XMD30A ;stop key
  400.  JSR XMD19 ;yes - abort transfer
  401. XMD30A LDA #132
  402.  STA XBLSZ
  403.  LDA RIDBS ;clear input buffer
  404.  STA RIDBE
  405.  LDA #0 ;initialize variables
  406.  STA TBCOUNT
  407.  STA TBCOUNT+1
  408.  LDA #1
  409.  STA BLN
  410.  STA BLO
  411.  EOR #255
  412.  STA BLCK1
  413. XMD30B JSR STOP ;check stop key
  414.  BNE XMD30C
  415.  JSR XMD17
  416.  JSR XMD19
  417. XMD30C JSR GIM ;get modem character
  418.  BNE XMD30B ;no character - loop
  419.  LDA DPORTB ;check for carrier
  420.  AND CARRIER
  421.  BEQ XMD30C1
  422.  JSR XMD28 ;verify abort from user
  423.  BEQ XMD30C
  424. XMD30C1 LDA RCVCHR
  425.  CMP #CAN ;is receiver cancelling?
  426.  BNE XMD30D ;no
  427.  JSR XMD19 ;yes - time to quit
  428. XMD30D CMP #NAK ;was transmission bad?
  429.  BEQ XMD31
  430.  CMP #67
  431.  BNE XMD30B ;no
  432.  LDA #10
  433.  JSR OUTMSG
  434.  LDA #133
  435.  STA XBLSZ
  436.  STA XMODE
  437. XMD31 JSR SETZERO
  438.  LDA #3 ;retransmit last block
  439.  STA CHRCNT ;initialize block variables
  440.  LDX #0
  441.  STX CKSUM
  442.  STX RSTAT
  443. XMD32 JSR STOP ;check stop key
  444.  BNE XMD32A
  445.  JMP XMD37X
  446. XMD32A LDX #8 ;get character from disk
  447.  JSR CHKIN
  448.  JSR GETIN
  449.  BIT TRON ;check for translate on
  450.  BPL XMD32B ;no - bypass conversion
  451.  JSR CNVRT ;yes - convert to ascii
  452. XMD32B STA RCVCHR ;store the character
  453.  JSR READSS ;watch dem disk errors!
  454.  AND #195 ;look for end-of-file
  455.  STA RSTAT ;and time-outs
  456.  BNE XMD33A
  457.  LDA RCVCHR ;calculate checksum with
  458.  JSR CHKADD ;this character
  459.  CMP #131 ;got a full block yet?
  460.  BNE XMD32 ;no - loop
  461.  BEQ XMD34 ;yes - process end of block
  462. XMD33A = *
  463.  LDA RCVCHR ;calculate checksum with
  464.  JSR CHKADD ;this character
  465.  CMP #131 ;is the block full?
  466.  BEQ XMD34 ;yes - bypadd padding
  467.  LDA #26 ;pad the final block with
  468.  STA PADCHR ;ctrl-z unless the last
  469.  LDA RCVCHR ;data character happens to
  470.  CMP #26 ;be a ctrl-z
  471.  BNE XMD33G ;if it is then use null
  472.  LDA #0
  473.  STA PADCHR
  474. XMD33G LDA PADCHR ;pad out the block until
  475.  STA RCVCHR ;we fill it up
  476. XMD38A JSR CHKADD
  477.  CMP #131
  478.  BNE XMD38A
  479. XMD34 BIT XMODE ;checksum or crc?
  480.  BPL XMD34A ;checksum
  481.  LDA CRC+1 ;fill in the
  482.  STA BLCH ;16-bit crc
  483.  LDA CRC
  484.  STA BLCH+1
  485.  JMP XMD34B
  486. XMD34A LDA CKSUM ;fill in the calculated
  487.  STA BLCH ;checksum
  488. XMD34B LDA #0
  489.  STA TEMPX
  490. XMD35 JSR STOP ;check the old stop key
  491.  BEQ XMD37X
  492.  LDX TEMPX ;now let us output the
  493.  LDA BLOCK,X ;entire block to the modem
  494.  JSR PTXMDM
  495.  LDA DPORTB ;dont forget to check for
  496.  AND CARRIER ;carrier loss
  497.  BEQ XMD35B
  498.  JSR XMD28
  499. XMD35B INC TEMPX ;did we finish the block yet?
  500.  LDA XBLSZ
  501.  CMP TEMPX
  502.  BNE XMD35
  503.  JSR SETJIF ;set the timeout
  504. XMD36 LDA DPORTB ;being cautious we continue to
  505.  AND CARRIER ;check for carrier
  506.  BEQ XMD36A
  507.  JSR XMD28
  508. XMD36A JSR GIM ;look for the receiver response
  509.  BEQ XMD37
  510.  JSR STOP ;no response yet - look for the
  511.  BEQ XMD37X ;stop key
  512.  JSR TSTJIF ;and check for a timeout
  513.  BCC XMD36 ;loop if not timed out yet
  514.  BCS XMD34 ;otherwise retransmit
  515. XMD37 LDA RCVCHR
  516.  CMP #NAK ;did he send a NAK?
  517.  BNE XMD37E
  518.  LDA #'n' ;update the display and go
  519.  STA DISPR8+18 ;back to retransmit
  520.  JMP XMD34
  521. XMD37E CMP #CAN ;did he send cancel?
  522.  BNE XMD37A
  523. XMD37X JSR XMD19 ;yes - then abort
  524. XMD37A CMP #ACK ;did he send ACK?
  525.  BEQ XMDACK
  526.  CMP #67
  527.  BNE XMD36 ;none of the above
  528. XMDACK LDA RSTAT ;check for status not zero
  529.  BEQ XMD38 ;no
  530.  JSR XMD17 ;yes - send EOT
  531.  JSR SETJIF ;set timeout
  532. XMD37B LDA JIFFY ;check the timeout and look
  533.  BMI XMD37C ;for final response from
  534.  JSR GIM ;the receiver
  535.  BNE XMD37B
  536. XMD37C LDA RSTAT ;check for end of file
  537.  AND #64
  538.  BEQ XMD37X ;no - abort
  539.  JMP XMD24A ;yes - display complete
  540. XMD38 INC BLO ;increment the block number
  541.  LDA #255
  542.  EOR BLO
  543.  STA BLCK1
  544.  JSR XMDBLK ;display block status
  545.  JMP XMD31 ;back for next block
  546. *
  547. * RECEIVE - START CRC AND SWITCH TO CHKSUM IF
  548. *           NO RESPONSE
  549. *
  550. XMD60 LDA #67 ;send 'C' to indicate CRC
  551.  JSR PTXMDM ;capability
  552.  JSR SETJIF ;set timer for retry
  553. XMD60A JSR GIM ;look for response
  554.  BEQ XMD60B ;yes
  555.  LDA JIFFY ;no - is time up?
  556.  CMP #1
  557.  BNE XMD60A ;no - keep looking
  558.  DEC CTRYS ;yes - decrement trys
  559.  BNE XMD60 ;not finished - try again
  560.  JSR XMD16 ;switch to checksum
  561.  RTS
  562. XMD60B LDA RCVCHR ;get received character
  563.  CMP #SOH ;is it start of xmodem block
  564.  BNE XMD60A ;no - ignore it
  565.  LDA #133 ;yes
  566.  STA XMODE ;set CRC mode
  567.  STA XBLSZ ;and CRC total block size
  568.  LDA #10 ;inform the user
  569.  JSR OUTMSG
  570.  RTS
  571. *
  572. * GET XMODEM CHAR
  573. *
  574. GIM LDX #5
  575.  JSR CHKIN
  576.  JSR GETIN ;try for character
  577.  STA RCVCHR ;and save result
  578.  JSR READSS ;now check status
  579.  RTS
  580. *
  581. * TEST JIFFY
  582. *
  583. TSTJIF LDA JIFFY
  584.  CMP #2
  585.  RTS
  586. *
  587. * SET JIFFY
  588. *
  589. SETJIF LDA #0
  590.  STA JIFFY
  591.  STA JIFFY+1
  592.  RTS
  593. *
  594. * PUT CHAR TO MODEM
  595. *
  596. PTXMDM PHA
  597.  LDX #5
  598.  JSR CHKOUT
  599. PTX01 LDA ENABLE ;is rs232 quiescent
  600.  AND #3 ;in both directions
  601.  BNE PTX01 ;no - wait until it is
  602.  PLA  ;yes - get character
  603.  JSR CHROUT ;and send it to modem
  604.  RTS
  605. *
  606. * CALCULATE CHECKSUM
  607. *
  608. CHKADD LDA RCVCHR
  609.  BIT XMODE
  610.  BPL CHKA1
  611.  JSR CRCMODE
  612. CHKA1 LDA RCVCHR
  613.  LDX CHRCNT
  614.  STA BLOCK,X
  615.  CLC
  616.  ADC CKSUM
  617.  STA CKSUM
  618.  INC CHRCNT
  619.  INX
  620.  TXA
  621.  RTS
  622. *
  623. * CRC MODE
  624. *
  625. CRCMODE STA CRCDATA
  626.  LDX #8
  627.  LDA CHRCNT
  628.  CMP #3
  629.  BGE CRCM1
  630.  RTS
  631. CRCM1 ASL CRCDATA
  632.  ROR A
  633.  AND #$80
  634.  EOR CRC+1
  635.  ASL CRC
  636.  ROL A
  637.  BCC CRCM2
  638.  TAY
  639.  LDA CRC
  640.  EOR PLY
  641.  STA CRC
  642.  TYA
  643.  EOR PLY+1
  644. CRCM2 STA CRC+1
  645.  DEX
  646.  BNE CRCM1
  647.  RTS
  648. *
  649. * CRC INIT
  650. *
  651. CRCINIT LDA #0
  652.  STA CRC
  653.  STA CRC+1
  654.  RTS
  655. *
  656. * OUTMSG PROMPT POINTER TABLE
  657. *
  658. PRMTBL = *
  659.  DA PROMPT4
  660.  DA PRMPT13
  661.  DA DISPR8
  662.  DA DISPR9
  663.  DA DISPR10
  664.  DA DISPR11
  665.  DA DISPR13
  666.  DA BUF
  667.  DA PRMPT10
  668.  DA PRMPT11
  669. *
  670. * PROMPTS
  671. *
  672. PROMPT4 DFB 13
  673.  TXT 'Filename for your disk: '
  674.  DFB 0
  675. PRMPT13 DFB 13
  676.  TXT 'DISK ERROR: '
  677.  DFB 0
  678. DISPR8 TXT 'TOT BLK 0000  CHK= '
  679.  DFB 13,145,0
  680. DISPR9 TXT 'TRANSFER COMPLETE'
  681.  DFB 13,0
  682. DISPR10 TXT 'TRANSFER ABORTED'
  683.  DFB 13,0
  684. DISPR11 TXT 'XMODEM PROTOCOL'
  685.  DFB 13,0
  686. DISPR13 TXT 'Invalid Filename'
  687.  DFB 13,0
  688. PRMPT10 TXT 'CARRIOR LOST: CONFIRM ABORT y/n  '
  689.  DFB 0
  690. PRMPT11 TXT 'using CRC'
  691.  DFB 13,0
  692. *
  693. * OUTPUT MESSAGE TO DEVICE
  694. *
  695. OUTMSG PHA
  696.  LDX #3
  697.  JSR CHKOUT
  698.  PLA
  699.  ASL A
  700.  TAX
  701.  LDA PRMTBL,X
  702.  STA MOVE
  703.  INX
  704.  LDA PRMTBL,X
  705.  STA MOVE+1
  706.  LDY #0
  707. OUTLP1 LDA (MOVE),Y
  708.  CMP #0
  709.  BEQ OUTEND
  710.  JSR CHROUT
  711.  INY
  712.  CPY #0
  713.  BNE OUTLP1
  714. OUTEND RTS
  715. *
  716. * CHECK ERROR CHANNEL
  717. *
  718. ERRCHN LDA #0
  719.  STA BUF
  720.  STA EBUFX
  721.  LDX #15
  722.  JSR CHKIN
  723. ERRL1 JSR GETIN
  724.  STA RCVCHR
  725.  JSR READSS
  726.  BNE ERRL2
  727.  LDA RCVCHR
  728.  LDX EBUFX
  729.  STA BUF,X
  730.  INC EBUFX
  731.  BNE ERRL1
  732. ERRL2 LDX EBUFX
  733.  LDA #0
  734.  STA BUF,X
  735.  LDA #7
  736.  JSR OUTMSG
  737.  JSR WAITTWO
  738.  LDA BUF
  739.  ORA BUF+1
  740.  AND #15
  741.  RTS
  742. *
  743. * DECIMAL CONVERSION TABLE
  744. *
  745. DECTAB DFB 16,39 ; 10,000
  746.  DFB 242,3 ; 1,000
  747.  DFB 100,0 ; 100
  748.  DFB 10,0 ; 10
  749.  DFB 1,0 ; 1
  750. COUNT DFB 0,0
  751. NUMBR DFB 0,0,0,0,0,32,32,0
  752. TMPCNT DFB 0,0
  753. *
  754. * OPEN DISK FILE A=LOGICAL FILE
  755. *
  756. OPENDK = *
  757.  TAY
  758.  LDX DRVDEV
  759.  JSR SETLFS
  760.  JSR OPEN
  761.  RTS
  762. *
  763. * CONVERT TO ASCII
  764. *
  765. CNVASC LDX #4
  766.  LDA #48
  767. CNVA4 STA NUMBR,X
  768.  DEX
  769.  BPL CNVA4
  770.  INX
  771. CNVA1 LDA COUNT
  772.  SEC
  773.  SBC DECTAB,X
  774.  STA TMPCNT
  775.  LDA COUNT+1
  776.  SBC DECTAB+1,X
  777.  STA TMPCNT+1
  778.  BCC CNVA2
  779.  STX TEMPX
  780.  TXA
  781.  LSR A
  782.  TAX
  783.  INC NUMBR,X
  784.  LDX TEMPX
  785.  LDA TMPCNT
  786.  STA COUNT
  787.  LDA TMPCNT+1
  788.  STA COUNT+1
  789.  JMP CNVA1
  790. CNVA2 INX
  791.  INX
  792.  CPX #10
  793.  BNE CNVA1
  794.  LDX #4
  795.  RTS
  796. *
  797. * DISPLAY XMODEM BLOCK
  798. *
  799. XMDBLK LDA #'a'
  800.  STA DISPR8+18
  801.  INC TBCOUNT
  802.  BNE XBLK2
  803.  INC TBCOUNT+1
  804. XBLK2 LDA TBCOUNT
  805.  STA COUNT
  806.  LDA TBCOUNT+1
  807.  STA COUNT+1
  808.  JSR CNVASC
  809.  LDX #4
  810. XBLK1 LDA NUMBR,X
  811.  STA DISPR8+7,X
  812.  DEX
  813.  BNE XBLK1
  814.  LDA #2
  815.  JSR OUTMSG
  816.  RTS
  817. *
  818. * WAIT TWO SECONDS
  819. *
  820. WAITTWO JSR SETJIF
  821. WAIT2 BIT JIFFY+1
  822.  BPL WAIT2
  823.  RTS
  824. *
  825. * GET A KEYBOARD CHARACTER
  826. *
  827. GETKEY LDX #0
  828.  JSR CHKIN
  829.  JSR GETIN
  830.  BEQ GETKEY
  831.  RTS
  832. *
  833. * INITIALIZE BLOCK VARIABLES
  834. *
  835. SETZERO LDA #0
  836.  STA ERR
  837.  STA CHRCNT
  838.  STA CKSUM
  839.  JSR CRCINIT ;XMODEM CRC
  840.  RTS
  841. *
  842. * OUTPUT TO SCREEN
  843. *
  844. SCNOUT PHA
  845.  LDX #3
  846.  JSR CHKOUT
  847.  PLA
  848.  JSR CHROUT
  849.  RTS
  850.